import time
import sqlite3
from dataStruct import *
import requests
import re

'''
B站各大区的tid(rid)号，参考https://github.com/SocialSisterYi/bilibili-API-collect/blob/master/video/video_zone.md
动画区：1；音乐区：3；舞蹈区：129；游戏区：4；知识区：36；科技区：188；运动区：234；
汽车区：223；生活区：160；美食区：211；动物圈：217；鬼畜区：119；时尚区：155；娱乐区：5；影视区：181
共选取15个大区（排除电影、电视剧、番剧、纪录片、国创等长视频、严肃视频大区）
'''
def fetchVideo():
    # 创建数据库保存爬取的视频信息
    conn = sqlite3.connect('./data/videoset.db')
    conn.isolation_level = None  # 自动提交修改，不用手动commit
    cur = conn.cursor()  # 创建游标
    # 定义表头
    cur.execute('CREATE TABLE Video (id INTEGER PRIMARY KEY, aid VARCHAR(10), title VARCHAR(50), view INTEGER, '
                'danmaku INTEGER, reply INTEGER, like INTEGER, coin INTEGER, favorite INTEGER, share INTEGER, '
                'maintype VARCHAR(10), tag VARCHAR(50), hint INTEGER)')
    # Bilibili APIs
    rid = {1: '动画', 3: '音乐', 129: '舞蹈', 4: '游戏', 36: '知识', 188: '科技', 234: '运动', 223:'汽车', 160: '生活',
           211: '美食', 217: '动物', 119: '鬼畜', 155: '时尚', 5: '娱乐', 181: '影视'}
    url0 = "https://api.bilibili.com/x/web-interface/dynamic/region?ps=30&rid="
    url1 = "http://api.bilibili.com/x/tag/archive/tags?aid="
    pos = 0
    for tid in rid.keys():
        url = url0 + str(tid)
        req = requests.get(url)
        content = req.text
        titles = re.findall(r'"title":"([^\"]*)"', content)  # 4.20 更新正则表达式
        stats = re.findall(r'"stat":{(.*?)}', content)
        descs = re.findall(r'"desc":"([^\"]*)",', content)
        tnames = re.findall(r'"tname":"(.*?)"', content)
        for i in range(30):
            # 处理视频的用户评价数据
            data = re.findall(r'"[a-z]*":(\d*)', stats[i])
            # 处理视频标签数据
            tag_req = requests.get(url1 + data[0])
            time.sleep(0.5)
            tags = re.findall(r'"tag_name":"(.*?)"', tag_req.text)
            tags.append(rid[tid])
            tags.append(tnames[i])
            # 处理视频的引导数据
            hint = 1 if re.findall(r'点赞|投币|收藏|关注|三连|3连', descs[i]) else 0
            # 将视频信息写入文件
            inp = '(' + str(pos) + ', \'' + data[0] + '\', \'' + titles[i].replace("'", "''") + '\', ' + data[
                1] + ', ' + data[2] + ', ' + data[3] + ',' \
                  + data[-2] + ',' + data[5] + ',' + data[4] + ',' + data[6] + ', \'' + rid[tid] + '\', \'' \
                  + str(tags).replace('\'', '"') + '\', ' + str(hint) + ')'
            cur.execute("INSERT INTO Video VALUES" + inp)
            pos += 1
        print("Successfully processed section " + str(tid))
    cur.close()
    conn.close()



if __name__ == "__main__":
    fetchVideo()
    print('done.')







